package com.xp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xp.entity.FlowExecution;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 流程执行记录数据访问接口
 * 
 * @author xp
 * @since 2025-01-01
 */
@Mapper
public interface FlowExecutionMapper extends BaseMapper<FlowExecution> {

    /**
     * 根据执行ID查询流程执行记录
     * 
     * @param executionId 执行ID
     * @return 流程执行记录
     */
    @Select("SELECT * FROM flow_execution WHERE execution_id = #{executionId}")
    FlowExecution selectByExecutionId(@Param("executionId") String executionId);

    /**
     * 根据流程编码查询执行记录
     * 
     * @param flowCode 流程编码
     * @return 流程执行记录列表
     */
    @Select("SELECT * FROM flow_execution WHERE flow_code = #{flowCode} ORDER BY start_time DESC")
    List<FlowExecution> selectByFlowCode(@Param("flowCode") String flowCode);

    /**
     * 根据流程编码和版本查询执行记录
     * 
     * @param flowCode 流程编码
     * @param flowVersion 流程版本
     * @return 流程执行记录列表
     */
    @Select("SELECT * FROM flow_execution WHERE flow_code = #{flowCode} AND flow_version = #{flowVersion} ORDER BY start_time DESC")
    List<FlowExecution> selectByFlowCodeAndVersion(@Param("flowCode") String flowCode, @Param("flowVersion") String flowVersion);

    /**
     * 分页查询流程执行记录列表
     * 
     * @param page 分页参数
     * @param flowCode 流程编码（可选）
     * @param status 执行状态（可选）
     * @param creatorId 执行人ID（可选）
     * @param startTimeBegin 开始时间范围-开始（可选）
     * @param startTimeEnd 开始时间范围-结束（可选）
     * @return 流程执行记录分页列表
     */
    IPage<FlowExecution> selectFlowExecutionPage(Page<FlowExecution> page, 
                                                @Param("flowCode") String flowCode,
                                                @Param("status") String status,
                                                @Param("creatorId") Long creatorId,
                                                @Param("startTimeBegin") LocalDateTime startTimeBegin,
                                                @Param("startTimeEnd") LocalDateTime startTimeEnd);

    /**
     * 根据执行状态查询执行记录
     * 
     * @param status 执行状态
     * @return 流程执行记录列表
     */
    @Select("SELECT * FROM flow_execution WHERE status = #{status} ORDER BY start_time DESC")
    List<FlowExecution> selectByStatus(@Param("status") String status);

    /**
     * 根据创建人ID查询执行记录
     * 
     * @param creatorId 创建人ID
     * @return 流程执行记录列表
     */
    @Select("SELECT * FROM flow_execution WHERE creator_id = #{creatorId} ORDER BY start_time DESC")
    List<FlowExecution> selectByCreatorId(@Param("creatorId") Long creatorId);

    /**
     * 根据链路追踪ID查询执行记录
     * 
     * @param traceId 链路追踪ID
     * @return 流程执行记录
     */
    @Select("SELECT * FROM flow_execution WHERE trace_id = #{traceId} ORDER BY start_time DESC LIMIT 1")
    FlowExecution selectByTraceId(@Param("traceId") String traceId);

    /**
     * 查询指定时间范围内的执行记录
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 流程执行记录列表
     */
    @Select("SELECT * FROM flow_execution WHERE start_time >= #{startTime} AND start_time <= #{endTime} ORDER BY start_time DESC")
    List<FlowExecution> selectByTimeRange(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 查询执行失败的记录
     * 
     * @return 流程执行记录列表
     */
    @Select("SELECT * FROM flow_execution WHERE status IN ('FAILED', 'ERROR', 'TIMEOUT') ORDER BY start_time DESC")
    List<FlowExecution> selectFailedExecutions();

    /**
     * 查询正在执行的记录
     * 
     * @return 流程执行记录列表
     */
    @Select("SELECT * FROM flow_execution WHERE status IN ('RUNNING', 'PENDING') ORDER BY start_time DESC")
    List<FlowExecution> selectRunningExecutions();

    /**
     * 统计指定流程的执行次数
     * 
     * @param flowCode 流程编码
     * @return 执行次数
     */
    @Select("SELECT COUNT(*) FROM flow_execution WHERE flow_code = #{flowCode}")
    Long countByFlowCode(@Param("flowCode") String flowCode);

    /**
     * 统计指定状态的执行次数
     * 
     * @param status 执行状态
     * @return 执行次数
     */
    @Select("SELECT COUNT(*) FROM flow_execution WHERE status = #{status}")
    Long countByStatus(@Param("status") String status);

    /**
     * 统计指定时间范围内的执行次数
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 执行次数
     */
    @Select("SELECT COUNT(*) FROM flow_execution WHERE start_time >= #{startTime} AND start_time <= #{endTime}")
    Long countByTimeRange(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);

    /**
     * 查询平均执行时长
     * 
     * @param flowCode 流程编码
     * @return 平均执行时长（毫秒）
     */
    @Select("SELECT AVG(duration) FROM flow_execution WHERE flow_code = #{flowCode} AND duration IS NOT NULL")
    Double getAverageDuration(@Param("flowCode") String flowCode);

    /**
     * 查询最近的执行记录
     * 
     * @param flowCode 流程编码
     * @param limit 限制数量
     * @return 流程执行记录列表
     */
    @Select("SELECT * FROM flow_execution WHERE flow_code = #{flowCode} ORDER BY start_time DESC LIMIT #{limit}")
    List<FlowExecution> selectRecentExecutions(@Param("flowCode") String flowCode, @Param("limit") Integer limit);
}